#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
智能PDF文本提取器
使用PyMuPDF库精确提取PDF正文内容
"""

from pathlib import Path
from typing import List
import re
from ..utils import ToolbeltLogger

# 延迟导入，避免在没有安装依赖时出错
try:
    import fitz  # PyMuPDF
    FITZ_AVAILABLE = True
except ImportError:
    FITZ_AVAILABLE = False
    fitz = None  # type: ignore


class PDFExtractor:
    """智能PDF文本提取器，专注于提取核心正文内容"""
    
    def __init__(self):
        """初始化PDF提取器"""
        if not FITZ_AVAILABLE:
            ToolbeltLogger.warning("PyMuPDF库未安装，无法提取PDF内容")
    
    def extract_main_text(self, pdf_path: Path) -> str:
        """
        从PDF文件中智能提取核心正文，并去除页眉、页脚、参考文献等噪音。
        
        Args:
            pdf_path (Path): PDF文件路径
            
        Returns:
            str: 提取的干净正文内容
        """
        if not FITZ_AVAILABLE or fitz is None:
            ToolbeltLogger.warning("PyMuPDF库未安装，无法提取PDF内容")
            return ""
            
        try:
            doc = fitz.open(pdf_path)
            clean_text_pages = []
            
            # 定义需要忽略的章节标题（不区分大小写，使用更宽泛的匹配）
            sections_to_ignore = re.compile(
                r'references|bibliography|acknowledgments|conflict of interest|'
                r'author contributions|funding|data availability statement|supplementary material',
                re.IGNORECASE | re.DOTALL
            )
            
            # 用于识别页眉/页脚的阈值，可根据文档类型调整
            page_height_threshold = doc[0].rect.height * 0.08 
            
            for page_num, page in enumerate(doc):
                page_main_content = []
                
                # 获取所有文本块
                blocks = page.get_text("blocks")
                
                for block in blocks:
                    # block = [x0, y0, x1, y1, text, block_no, block_type]
                    text_content = block[4].strip()
                    y0 = block[1]
                    
                    # 1. 过滤页眉和页脚：检查文本块的垂直位置
                    if y0 < page_height_threshold or y0 > (page.rect.height - page_height_threshold):
                        continue
                        
                    # 2. 过滤特定章节：如果找到参考文献等关键词，停止处理
                    if sections_to_ignore.search(text_content):
                        # 找到参考文献等部分，停止处理当前页及后续页面
                        doc.close()
                        return " ".join(clean_text_pages)

                    # 3. 过滤噪音：去除页码、图表/表格标题和DOI
                    if re.match(r'^\d+$', text_content) or \
                       re.match(r'(fig(ure)?|table|box) \d+.*', text_content, re.IGNORECASE) or \
                       'doi:' in text_content.lower():
                        continue
                        
                    # 4. 过滤版权信息和期刊名称
                    if 'copyright' in text_content.lower() or 'elsevier' in text_content.lower() or 'frontiers in' in text_content.lower() or 'science bulletin' in text_content.lower():
                        continue

                    # 将清理后的文本块添加到当前页面内容列表
                    page_main_content.append(text_content)
                
                # 合并当前页面的内容，并去除多余的空行
                # 在这里，我们将所有文本块用空格连接，而不是换行符，以防止句子被错误分割
                clean_page_text = ' '.join(page_main_content)
                # 再次清理多余的空格
                clean_page_text = re.sub(r'\s+', ' ', clean_page_text).strip()
                clean_text_pages.append(clean_page_text)
            
            doc.close()
            # 最终合并时，使用换行符来分隔页面，但确保页面内的文本是连续的
            final_text = "\n\n".join(clean_text_pages)
            
            # 增加一个通用规则，将所有带有连字符的单词重新组合
            # 例如: "weighted-network" 会被合并为 "weighted network"
            final_text = re.sub(r'(\w+)-\s+(\w+)', r'\1\2', final_text)
            
            return final_text
            
        except Exception as e:
            ToolbeltLogger.warning(f"无法提取 {pdf_path} 的文本内容: {e}")
            return ""
    
    def extract_and_chunk(self, pdf_path: Path) -> List[str]:
        """
        提取正文并返回一个包含完整文本的列表，与LLMSummarizer兼容。
        
        Args:
            pdf_path (Path): PDF文件路径
            
        Returns:
            List[str]: 包含干净正文的单个元素列表
        """
        clean_text = self.extract_main_text(pdf_path)
        return [clean_text]
    
    def extract_text(self, pdf_path: Path) -> str:
        """
        从PDF文件中提取文本内容（使用PyMuPDF提高效率）
        保留此方法以确保向后兼容性
        
        Args:
            pdf_path (Path): PDF文件路径
            
        Returns:
            str: 提取的文本内容
        """
        return self.extract_main_text(pdf_path)
    
    def clean_text(self, text: str) -> str:
        """
        清洗文本，去除多余空格、换行符等
        
        Args:
            text (str): 原始文本
            
        Returns:
            str: 清洗后的文本
        """
        # 去除多余的空白字符（包括空格、制表符、换行符等）
        text = re.sub(r'\s+', ' ', text)
        # 去除首尾空白字符
        text = text.strip()
        return text
    
    def chunk_text(self, text: str, chunk_size: int = 3000) -> List[str]:
        """
        将文本按逻辑分块 (已弃用)
        
        Args:
            text (str): 要分块的文本
            chunk_size (int): 分块大小 (已弃用)
            
        Returns:
            List[str]: 文本块列表 (始终返回包含完整文本的单个元素列表)
        """
        # 根据用户偏好，不再分块，直接返回完整文本
        return [text]